分类
联系方式
  1. 新浪微博
  2. E-mail

Maeiee Weekly No.4

文章

  1. 《干货 | 携程酒店Flutter性能优化实践》
    1. 性能指标
      1. FPS:每秒传输帧数 (Frames Per Second)
      2. TTI:从页面加载开始到页面处于完全可交互状态 (Time To Interactive)
    2. Performance View
      1. 一个柱一帧,绘制时长
      2. 蓝色:满足 60fps
      3. 橙色:不满足 60fps
      4. Enhance tracing 模式:看到长耗时方法、Widget build
    3. 帧绘制耗时前三
      1. UI 绘制:widget build、layout、paint,CPU 时间
      2. 光栅化:GPU 时间
      3. vsync ahead:vsync 信号与 widget build 之间延迟
    4. 优化方法1:控制 setState次数,减小 Provider 范围
      1. 减少不必要 UI 绘制:控制 build 次数
        1. 通过 shouldRebuild 限制
      2. 缩小范围:改变 Widget 树层级
        1. Consumer、Selector 缩小范围
    5. 预构建 Widget(AnimatedBuilder)
    6. const widget
      1. final:一次赋值,不能改变
      2. const:常量值,确定的值,编译时确定
      3. const widget:编译阶段已经确定
        1. 性能开销小
    7. 耗时计算放入 Isolate
      1. Dart 单线程:耗时运算阻塞 UI 线程
      2. 注:有坑,内存不足 DartVM 会自动清 Isolate
    8. 懒加载
      1. ListView.builder
      2. PageView.builder
      3. GridView.builder
      4. 判断 item 是否在屏幕内才绘制
      5. Column、Row 一次性绘制,重复结构需避免
    9. 分帧渲染
      1. 错峰加载:Widget 树按照优先级分批绘制
      2. 原理:空容器占位,听从调度
    10. GPU 性能定位
      1. checkerboardOffscreenLayers
        1. 多视图叠加用到 Canvas 里的savaLayer 方法
        2. 半透明场景,GPU 开销大
        3. MaterialApp 设为 checkerboardOffscreenLayers true
        4. 分析器自动检测多视图叠加
        5. 使用 saveLayer 的 widget 变成棋盘格
      2. checkerboardRasterCacheImages
        1. 另一类非常消耗性能的操作是,渲染图像
        2. 多层次的缓存快照,这样Widget 重建无需重新绘制静态图像
        3. 在界面重绘时频繁闪烁的图像(即没有静态缓存)
        4. 把需要静态缓存的图像加到 RepaintBoundary 中
          1. 可以确定 Widget 树的重绘边界
          2. 自动将其缓存,避免重复刷新
    11. 内存泄露
      1. 原理:Expando
      2. 常见内存泄露场景:
        1. 通过 Channel 调用 Native,Native 不给返回值,导致 Future、及页面泄露
        2. 订阅没有释放:Timer、EventBus 等
  1. 《Flutter 2022 路线图》
    1. 开发体验
      1. 最关注,打造开发者喜爱的 SDK
      2. 提供解决常见问题的 Widgets、Plugins
      3. 迭代开发工具链、lint、文档实例
      4. Web 端 HotReload,Dart-to-JS 堆栈跟踪
    2. 桌面端
      1. 计划桌面支持实现 Stable
      2. 逐个平台发布:Windows、Linux、macOS
      3. 扩大回归测试套件
        1. 通过测试,不破坏现有代码前提下演进
        2. 带来更强的信心
    3. Web
      1. 提升性能、插件质量
      2. 辅助功能
      3. 浏览器间一致性
      4. 使 Flutter 程序更容易嵌入 HTML 页面
    4. 框架(Framework)
      1. Material 组件库升级到 Material3
      2. 跨组件文本选择
      3. 提升文本编辑体验
      4. iPadOS 手写支持
      5. 跨平台菜单框架
    5. 引擎
      1. 支持单 isolate 内渲染多个 window
    6. Dart
      1. 引入一个核心特性
        1. 可能:metaprogramming
      2. 引入小语言体色和嗯
        1. 可能:改进包导入语法
      3. 扩展编译工具链:
        1. 支持编译到 Wasm,取决于 WasmGC 的标准化
    7. 卡顿:
      1. 2021 年解决了大量卡顿问题
      2. 需要重新思考对 shader 的使用,重写图形底层
      3. 2022 iOS 会迁到新底层
      4. 引入其他性能改进,如新 DisplayList 系统
    8. 放弃对 32位 iOS 的支持
  2. 《WebAssembly生态及关键技术综述》
    1. WebAssembly 字节码和内存模型规范
      1. 安全隔离
      2. 高效、体积小
      3. 跨平台,可移植二进制
      4. 多语言支持
    2. WebAssembly 背景
      1. 大型软件:不同开发语言协作问题
        1. 统一的集成方式和接口
        2. 交互过程中引入额外损耗(内存、性能)
      2. 统一的部署、运行方式:安全、隔离、跨平台
      3. 开发者使用多种编程语言,技术栈负担
    3. 场景:
      1. JS、Python:热点模块用 WebAssembly 实现提高性能
      2. Rust:编译成 WebAssembly 提供给 JS、Python,降低开发者门槛
      3. C++:编译成 WebAssembly 沙箱运行,更安全,开箱即用
    4. WebAssembly 开发生态
      1. C/C++
        1. WebAssembly 作为 LLVM 默认支持的后端
        2. Clang 将 C/C++ 直接生成 WebAssembly
        3. Emscripten
          1. 提供了常用的 C/C++ 库( sys-libs )
          2. Binaryen:进一步优化,生成 JavaScript API
      2. Rust
        1. Rust 编译器仅仅是一个编译器前端
        2. Cargo、wasm-bindgen 编译
      3. Go:TinyGo 是基于 LLVM 后端实现的 Go 编译器
      4. Java:
        1. TeaVM:
          1. Java 字节码的静态编译器(AOT)
          2. 生成的 JavaScript 和 WebAssembly 可以在浏览器中运行
          3. TeaVM 不需要源代码,只需要编译好的类文件
        2. Bytecoder:
          1. 将 JVM 字节码解析并转换为中间表示
          2. 再由 LLVM 转 WebAssembly
        3. CheerpJ:基于 LLVM 的 Java 字节码到 WebAssemlby/Javascript 的 AOT 编译器。
        4. JWebAssembly:Java 字节码编译为 WebAssembly
      5. Javascript/TypeScript/AssemblyScript
        1. Assemblyscript
          1. 面向 WebAssembly 标准的严格类型化的 TypeScript 变体
          2. 通过 Binaryen 后端编译为 WebAssembly
        2. XScript:TypeScript 语法兼容的静态编译型语言
        3. ts2wasm:TypeScript 编译生成 WebAssembly
    5. WebAssembly Runtimes
      1. wasmtime:非 Web 环境执行 WebAssembly 和 WASI 平台绑定
        1. 目前仅在 x86_64 上保证可用并且性能比 llvm 要差很多
        2. 其他平台的支持还在进行
      2. wasmer:
        1. 提供能够在从桌面到云、边缘和物联网设备等随处可运行的超轻量级容器。
        2. 最大的好处是"开箱即用"
      3. WasmEdge
        1. 主要应用于"应该使用 Docker 而 Docker 用不起来的地方"
      4. wamr
        1. 适合资源极其有限的小型嵌入式设备
      5. V8:也能够运行 WASM 模块
  3. 《‘AWS vs K8s’ is the new ‘Windows vs Linux’》
    1. 少数人虚度光阴在折腾 Linux
      1. 为啥不用 Windows,要啥有啥?
      2. 答案多种多样,都有特殊的理由证明这种努力是合理的
    2. 折腾 Kubernetes 就像折腾 Linux 的人
      1. 难搞:不是开箱机用,API 还老变
      2. Kubernetes 的开源质量远远高于大多数项目,但是的确不好上手
      3. 每隔几个月还有新技术出现,生态迭代非常快
      4. 为啥不用 AWS,要啥有啥?
    3. 名言:knative 俱乐部的第一条规则是你不能解释什么是 knative
    4. AWS 相当于 Windows
      1. 跟 Windows 一样,AWS 是最终的产品
      2. 服务是稳定且固定的,API 可靠
    5. 汽车比喻
      1. 大多数人希望又一辆不需要经常修理的汽车
      2. 有的人喜欢维护汽车
      3. 有的公司保留机械师维护车队,因为大规模自己修更便宜
    6. AWS 和 Kubernetes
      1. AWS 没有看到 Kubernetes 的意义
      2. 尽管有 EKS,但是不令人满意
      3. AWS 的人不理解,为什么有了 ECS 还需要 EKS
    7. AWS 的竞争对手:私人数据中心
    8. 私有云失败的原因
      1. 企业无法正确管理弹性需求
      2. 如果你想改造企业的 IT,就从财务开始。如果你不知道为什么要从财务开始,你肯定会失败。
  4. 《Why I quit Android Development after 10 years and what I plan to do now》
    1. 原作者十年 Android 开发,经历架构变迁
    2. 带领 Android 开发团队,最近四五年接触后端
    3. 厌倦了写 UI
      1. 厌倦了跟 UI/UX 开会
      2. 花费了大量时间,解释为什么某个需求做不了
    4. 厌倦了写业务
      1. 完全由设计师和产品经理主导
      2. 业务逻辑,缺少工程化
      3. 跳不出 Android API
    5. 步入夕阳的 Android 开发(吐槽)
      1. 不想再花好几天,就为了卡片的边框
      2. 讨论好几天,为了使用单选还是复选按钮
      3. 不想再学习新的库处理生命周期和导航,未来 12 个月内再次被替换
    6. 转后端
      1. 开发每秒服务上千用户的系统很迷人
      2. 未来路线图:
        1. k8s 认证,成为云大师
        2. 学数据库工作原理
        3. 研究 DevOps
      3. 找回了开发的乐趣,新的神秘性和复杂工程问题
    7. Android 开发的前途
      1. 客户端开发很难向上走(架构师、经理)
      2. 眼界、技术栈太窄
  5. 《Install K3S on Arch Linux with, firewalld, LetsEncrypt, and Traefik》
    1. k8s/k3s 目前不支持 nftables
    2. k3s 在 AUR 源里,服务名 k3s
  6. 《K8s 还是 K3s?This is a question》
    1. Kubernetes,由 Google 设计得高可用可扩展平台
    2. Rancher Labs
      1. Rancher 开源企业级 k8s 管理平台
      2. k3s 轻量级 Kubernetes 发行版
    3. k3s
      1. Kubernetes 打包到 60MB 二进制
      2. 资源要求更少
      3. 通过 CNCF 认证的 Kubernetes 发行版
      4. 可以让 Pod 在 master 和节点上运行
    4. k8s vs k3s: 差异解析
    5. 轻量级Kubernetes k3s初探
    6. 场景
      1. 廉价硬件部署
      2. 持续集成
  7. 《KUBERNETES IN ARCH LINUX》
    1. archwiki Kubernetes
    2. 设置一个“单节点”集群
    3. 学到一招:使用 lxd 创建一个 Arch 容器,作为 Playground
    4. kubernetes 分为 3 个包:
      1. kubernetes-control-plane:control planes/master nodes
      2. kubernetes-node:worker nodes
      3. kubernetes-tools:诸如 kubectl 的工具
    5. Container Runtimes
      1. 《一文看懂 Container Runtime》
      2. 采用 containerd
    6. kubeadm 初始化 kubernetes cluster